{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 机器读心术之神经网络与深度学习第5课书面作业\n",
    "\n",
    "学号：207567\n",
    "\n",
    "**书面作业：**\n",
    "\n",
    "1. 阅读《Matlab神经网络原理与实例精解》一书第10.4-10.5节，用模拟退火算法求解TSP问题，尝试使用不同的退火降温策略，比较一下求解结果，并解释说明之  \n",
    "1）源代码已经上传到课程资源，自己作适当修改  \n",
    "2）使用中国31城市数据，已经上传到课程资源  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**答：**  \n",
    "参照Matlab代码，我用python实现了一下，采用中国31城市数据对比了三种退火降温策略（$\\lambda$指数下降，log下降，分数下降），代码及运行效果如下（基于jupyter notebook）："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "#准备数据\n",
    "dist = np.zeros((31,31))\n",
    "with open('TSP问题中国31城市数据.txt','r',encoding='gbk') as f:\n",
    "    s = f.readline() # skip first line\n",
    "    s = f.readline() # read city name\n",
    "    citys = s.split()[1:]\n",
    "    s = f.readline() #skip */\n",
    "    s = f.readline() #skip white line\n",
    "    s = f.readline() #skip {\n",
    "    for i in range(30):\n",
    "        s = f.readline().strip()\n",
    "        s = s[:-1] if s[-1]==',' else s\n",
    "        r = s.split(',')\n",
    "        r = [float(x) for x in r]\n",
    "        dist[i,i+1:] = r\n",
    "dist += dist.transpose()\n",
    "city2id = {c:i for i, c in enumerate(citys)}\n",
    "id2city ={i:c for i, c in enumerate(citys)}\n",
    "\n",
    "def tsp_len(dis, path):\n",
    "    tsplen = 0\n",
    "    for i in range(len(path)-1):\n",
    "        tsplen += dis[path[i]][path[i+1]]\n",
    "    tsplen += dis[path[0]][path[-1]]\n",
    "    return tsplen\n",
    "\n",
    "def tsp_new_path(old_path):\n",
    "    if np.random.rand() < 0.25:\n",
    "        chpos = np.random.randint(0,len(old_path),2)\n",
    "        new_path = old_path.copy()\n",
    "        new_path[chpos[0]], new_path[chpos[1]] = old_path[chpos[1]], old_path[chpos[0]]\n",
    "    else:\n",
    "        d = np.random.randint(0,len(old_path),3)\n",
    "        d.sort()\n",
    "        a,b,c = d\n",
    "        if a != b and b != c:\n",
    "            new_path = old_path.copy()\n",
    "            new_path[a:a+c-b] = old_path[b:c]\n",
    "            new_path[a+c-b:c] = old_path[a:b]\n",
    "        else:\n",
    "            new_path = tsp_new_path(old_path)\n",
    "    return new_path\n",
    "\n",
    "\n",
    "lambda_ = 0.95 #指数下降参数\n",
    "\n",
    "def lambda_decline(n, t0):\n",
    "    return (lambda_**n)*t0\n",
    "\n",
    "def log_decline(n, t0):\n",
    "    return t0/np.log(1+n)\n",
    "\n",
    "def frac_decline(n, t0):\n",
    "    return t0/(1+n)\n",
    "\n",
    "def tsp_solution(dist_matrix, MAX_ITER = 2000, MAX_M = 20, T0 = 100, decline_func = lambda_decline):\n",
    "    x0 = np.random.permutation([i for i in range(dist_matrix.shape[0])])\n",
    "    T = T0\n",
    "    iter = 1\n",
    "    x = x0\n",
    "    xx =[x0]\n",
    "    di = [tsp_len(dist_matrix,x0)]\n",
    "    n = 1\n",
    "\n",
    "    while iter <= MAX_ITER:\n",
    "        m=1\n",
    "        while m <= MAX_M:\n",
    "            newx = tsp_new_path(x)\n",
    "            old1 = tsp_len(dist_matrix, x)\n",
    "            new1 = tsp_len(dist_matrix, newx)\n",
    "            if old1 > new1:\n",
    "                x = newx\n",
    "                xx.append(x)\n",
    "                di.append(new1)\n",
    "                n += 1\n",
    "            else:\n",
    "                tmp = np.random.rand()\n",
    "                if tmp < np.exp(-(new1-old1)/T):\n",
    "                    x = newx\n",
    "                    xx.append(x)\n",
    "                    di.append(new1);\n",
    "                    n += 1\n",
    "            m += 1\n",
    "        iter += 1\n",
    "        T = decline_func(iter-1, T0)\n",
    "    return xx, di\n",
    "\n",
    "def tsp_solution1(dist_matrix, MAX_ITER = 2000, MAX_M = 20, T0 = 100, decline_func = lambda_decline):\n",
    "    x0 = np.random.permutation([i for i in range(dist_matrix.shape[0])])\n",
    "    T = T0\n",
    "    iter = 1\n",
    "    x = x0\n",
    "    xx =[x0]\n",
    "    di = [tsp_len(dist_matrix,x0)]\n",
    "    n = 1\n",
    "\n",
    "    while iter <= MAX_ITER:\n",
    "        m=1\n",
    "        while m <= MAX_M:\n",
    "            newx = tsp_new_path(x)\n",
    "            old1 = tsp_len(dist_matrix, x)\n",
    "            new1 = tsp_len(dist_matrix, newx)\n",
    "            if old1 > new1:\n",
    "                x = newx\n",
    "                xx.append(x)\n",
    "                di.append(new1)\n",
    "                n += 1\n",
    "            else:\n",
    "                tmp = np.random.rand()\n",
    "                if tmp < np.exp(-(new1-old1)/T):\n",
    "                    x = newx\n",
    "                    xx.append(x)\n",
    "                    di.append(new1);\n",
    "                    n += 1\n",
    "            m += 1\n",
    "        iter += 1\n",
    "        T = decline_func(iter-1, T0)\n",
    "    return xx, di"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1d4956d1f70>"
      ]
     },
     "execution_count": 202,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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7GP9+vWcd955pKWl8cwzzzS63/r++c9/MnDgQM455xw++eSTmvK8vDwuv/xyxo4dy9ixY2vWFRcXc9111zFixAhGjhzJ66+/fsI+q1s/y5cvZ8KECVxxxRUMHjyYq6++muor22vWrOGcc84hIyODSZMmsW/fvlY4m+2v045l1GIikHqGJQTTJd33701s3nukVfc5tFc0935/mFfbhoWF8eabbxIdHc3BgwcZP348U6dOBSA7O5t//etfPP3004wdO5aXX36ZFStWsHDhQh566CHeeustADZs2MBnn33G0aNHGT16NFOmTCEpKcnjfmt3nO7bt497772XNWvWEBMTw7nnnsvo0aMBuP3227njjjs488wz2bVrF5MmTWLLli3cf//9xMTEsHHjRgAKCwsbPb61a9eyadMmevXqxRlnnMEnn3zCaaedxq233srbb79NYmIiCxYs4J577uG5555r7qn2Of9LCAA9hsP6V+DoQYjs7utojOkyVJVf//rXfPTRRwQEBLBnzx5yc3MB6NevHyNGjABg2LBhTJw4ERFhxIgR7Ny5s2Yfl156KeHh4YSHh3PuueeyevVqpkyZ4nG/PXv2rKm3atUqJkyYQPUt6VdddRVfffUVAEuWLGHz5s012x45coSioiKWLFnC/Pnza8rj4uIaPb5x48aRkuLcLJmens7OnTuJjY3lyy+/5IILLgCgsrKS5OTkxnbTYflnQujpdmPs3wj9z/VtLMa0Im+/ybeVefPmkZeXx5o1awgODiY1NbXmXvjQ0NCa7QICAmp+DwgIoKKiomZd/dslRaTR/dbf1pOqqipWrlxJeHh4nXJVbdbtmbWPITAwkIqKClSVYcOGsXLlSq/301H5Xx8COC0EgNwvG9/OGNMshw8fJikpieDgYJYtW8a33zY40nKD3n77bUpKSsjPz2f58uWMHTvWq/2edtppLF++nPz8fMrLy/nXv/5Vs+7CCy/kySefrPl93bp1HsubumTkyaBBg8jLy6tJCOXl5WzatKnZ++kI/DMhRHaHqJ6Q2zn/0YzpqK6++mqysrLIzMxk3rx5DB48uNn7GDduHFOmTGH8+PH893//N7169fJqv8nJycyZM4fTTz+d888/nzFjxtSse+KJJ8jKymLkyJEMHTqUv/3tbwD85je/obCwkOHDhzNq1CiWLWt+32JISAivvfYav/rV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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "xx1, di1 = tsp_solution(dist,2000, 20, 100, lambda_decline)\n",
    "xx2, di2 = tsp_solution(dist,2000, 20, 100, decline_func=log_decline)\n",
    "xx3, di3 = tsp_solution(dist,2000, 20, 100, decline_func=frac_decline)\n",
    "cut = min(len(di1), len(di2), len(di3))\n",
    "row = np.linspace(1,cut,cut-1)\n",
    "# plt.figure(figsize=(5,5), dpi=150)\n",
    "plt.title('distance')\n",
    "plt.plot(row,di1[1:cut])\n",
    "plt.plot(row,di2[1:cut])\n",
    "plt.plot(row,di3[1:cut])\n",
    "plt.legend(['lamba decline','T0/log(1+n) decline','T0/(1+n) decline'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "退火降温策略：lamba decline\n",
      "平均最优解选择151次路径\n",
      "平均最优解：15634.843280000001\n",
      "\n",
      "退火降温策略：T0/log(1+n) decline\n",
      "平均最优解选择151次路径\n",
      "平均最优解：15639.880719999997\n",
      "\n",
      "退火降温策略：T0/(1+n) decline\n",
      "平均最优解选择151次路径\n",
      "平均最优解：15704.73776\n",
      "\n"
     ]
    }
   ],
   "source": [
    "decline = [lambda_decline, log_decline, frac_decline]\n",
    "decline_name = ['lamba decline','T0/log(1+n) decline','T0/(1+n) decline']\n",
    "for k in range(3):\n",
    "    bestd, index, round = 0, 0, 20\n",
    "    for i in range(round):\n",
    "        xx, di = tsp_solution(dist,2000, 20, 100, decline[k])\n",
    "        bestd1 = min(di)\n",
    "        bestd += bestd1\n",
    "        index += di.index(bestd1)\n",
    "    bestd, index = bestd/round, index/round\n",
    "    print(f'退火降温策略：{decline_name[k]}\\n平均最优解选择{index1}次路径\\n平均最优解：{bestd}\\n')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上面的三种降温方法来看，多次运行平均结果：\n",
    "1. 指数下降法的解最好，其次是分数下降法和对数下降法，后两者谁差也是有概率的。  \n",
    "2. 原因从下面这张对比3种降温法下温度下降曲线可以看出，对数下降下后续温度相比其他2种明显要高，温度高意味着能量高，意味着解不稳定没有稳定下降到全局最小值上。分数下降法前面温度下降得太快，有可能提早陷入局部最小值上。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\kzcao\\AppData\\Local\\Temp/ipykernel_12068/907057840.py:54: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return t0/np.log(1+n)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1d493e4c970>"
      ]
     },
     "execution_count": 188,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "row1 = np.linspace(0,99,100)\n",
    "t1 = [lambda_decline(i,200) for i in row1]\n",
    "t2 = [log_decline(i,200) for i in row1]\n",
    "t3 = [frac_decline(i,200) for i in row1]\n",
    "plt.title('T')\n",
    "plt.plot(row1,t1)\n",
    "plt.plot(row1,t2)\n",
    "plt.plot(row1,t3)\n",
    "plt.legend(['lamba decline','T0/log(1+n) decline','T0/(1+n) decline'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "fb9f349487484364a76a86d689de2291b320d01c749a280950eb5136d479374c"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
